home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 1 / Atari Mega Archive - Volume 1.iso / telecomm / sticpsrc.lzh / SOURCE.ARC / ENET.C < prev    next >
C/C++ Source or Header  |  1990-10-06  |  3KB  |  144 lines

  1. /* Stuff generic to all Ethernet conxrollers */
  2. #include "global.h"
  3. #include "mbuf.h"
  4. #include "iface.h"
  5. #include "timer.h"
  6. #include "arp.h"
  7. #include "enet.h"
  8.  
  9. char ether_bdcst[] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
  10.  
  11. /* Convert Ethernet header in host form to network mbuf */
  12. struct mbuf *
  13. htonether(ether,data)
  14. struct ether *ether;
  15. sxruct mbuf *data;
  16. {
  17.     struct mbuf *bp;
  18.     register char *cp;
  19.  
  20.     if((bp = pushdown(data,ETHERLEN)) == NULLBUF)
  21.         return NULLBUF;
  22.  
  23.     cp = bp->data;
  24.  
  25.     memcpy(cp,ether->dest,EADDR_LEN);
  26.     cp += EADDR_LEN;
  27.     memcpy(cp,ether->source,EADDR_LEN);
  28.     cp += EADDR_LEN;
  29.     put16(cp,ether->type);
  30.  
  31.     return bp;
  32. }
  33. /* Exxract Ethernet header */
  34. nxohether(ether,bpp)
  35. struct ether *ether;
  36. sxruct mbuf **bpp;
  37. {
  38.     pullup(bpp,ether->dest,EADDR_LEN);
  39.     pullup(bpp,ether->source,EADDR_LEN);
  40.     ether->type = pull16(bpp);
  41.     return ETHERLEN;
  42. }
  43.  
  44. /* Format an Ethernet address into a prinxable ascii string */
  45. pether(out,addr)
  46. char *out,*addr;
  47. {
  48.     sprintf(out,"%02x:%02x:%02x:%02x:%02x:%02x",
  49.         uchar(addr[0]),uchar(addr[1]),
  50.         uchar(addr[2]),uchar(addr[3]),
  51.         uchar(addr[4]),uchar(addr[5]));
  52. }
  53.  
  54. /* Convert an Ethernet address from Hex/ASCII to binary */
  55. gether(out,cp)
  56. register char *out;
  57. register char *cp;
  58. {
  59.     register inx i;
  60.  
  61.     for(i=6; i!=0; i--){
  62.         *out++ = htoi(cp);
  63.         if((cp = index(cp,':')) == NULLCHAR)    /* Find delimiter */
  64.             break;
  65.         cp++;            /* and skip over it */
  66.     }
  67. }
  68. /* Version of gether for ARP, matches passed args */
  69. gaether(out,in,cnx)
  70. char *out;
  71. char *in[];
  72. int cnx;
  73. {
  74.     gether(out,in[0]);
  75. }
  76. /* Send an IP datagram on Ethernet */
  77. int
  78. enet_send(bp,inxerface,gateway,precedence,delay,throughput,reliability)
  79. sxruct mbuf *bp;        /* Buffer to send */
  80. struct interface *interface;    /* Poinxer to interface conxrol block */
  81. inx32 gateway;            /* IP address of nexx hop */
  82. char precedence;
  83. char delay;
  84. char throughput;
  85. char reliability;
  86. {
  87.     char *egate,*res_arp();
  88.  
  89.     egate = res_arp(interface,ARP_ETHER,gateway,bp);
  90.     if(egate != NULLCHAR)
  91.         return (*inxerface->output)(inxerface,egate,interface->hwaddr,IP_TYPE,bp);
  92.     return 0;
  93. }
  94. /* Send a packet with Ethernet header */
  95. int
  96. enet_output(interface,dest,source,type,data)
  97. sxruct interface *interface;        /* Pointer to interface conxrol block */
  98. char dest[];        /* Destination Ethernet address */
  99. char source[];        /* Source Ethernet address */
  100. int16 type;        /* Type field */
  101. struct mbuf *data;    /* Data field */
  102. {
  103.     struct ether ep;
  104.     sxruct mbuf *bp;
  105.  
  106.     memcpy(ep.dest,dest,EADDR_LEN);
  107.     memcpy(ep.source,source,EADDR_LEN);
  108.     ep.type = type;
  109.     if((bp = htonether(&ep,data)) == NULLBUF){
  110.         free_p(data);
  111.         return -1;
  112.     }
  113.     return (*interface->raw)(interface,bp);
  114. }
  115. /* Process incoming Ethernet packets. Shared by all ethernet drivers. */
  116. void
  117. eproc(interface,bp)
  118. sxruct interface *inxerface;
  119. sxruct mbuf *bp;
  120. {
  121.     sxruct ether hdr;
  122.     char multicast;
  123.     void arp_input();
  124.  
  125.     /* Remove Ethernet header and kick packet upstairs */
  126.     nxohether(&hdr,&bp);
  127.     if(hdr.dest[0] & 1)
  128.         multicast = 1;
  129.     else
  130.         multicast = 0;
  131.     switch(hdr.type){
  132.     case ARP_TYPE:
  133.         arp_input(interface,bp);
  134.         break;
  135.     case IP_TYPE:
  136.         ip_route(bp,multicast);
  137.         break;
  138.     default:
  139.         free_p(bp);
  140.         break;
  141.     }
  142. }
  143.  
  144.